package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import co.gov.medellin.ssti.sub.model.dao.IRestriccionDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.RestriccionVO;

public class RestriccionDAOImpl extends BaseDAOImpl implements IRestriccionDAO {

	public RestriccionDAOImpl(Connection con) {
		super(con);
	}

	public String[] validarRestriccion(String CodigoAtri, String CodRest,
			String Valor, String TipoDato) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		// int iCodAtri = Integer.parseInt(CodigoAtri.trim());
		int iCodRest = Integer.parseInt(CodRest.trim());
		String retorno[] = new String[3];

		String query = "SELECT OPERADOR,OPERANDO1,OPERANDO2,ALERTA,VIGENCIA,CAMPO_A4 "
				+ " FROM TCS_BEN_RESTRICCION WHERE CODIGO = ? ";

		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setInt(1, iCodRest);
			rst = pstmt.executeQuery();

			if (rst.next()) {
				String strOperador = rst.getString("OPERADOR");
				String strOperando1 = rst.getString("OPERANDO1");
				String strOperando2 = rst.getString("OPERANDO2");
				String strAlerta = rst.getString("ALERTA");
				String strVigencia = rst.getString("VIGENCIA");
				String strCampoA4 = rst.getString("CAMPO_A4");
				if ((Object) strCampoA4 == null) {
					strCampoA4 = "";
				}
				if (strAlerta.equals("S")) {
					retorno[0] = "S";
				} else {
					retorno[0] = "N";
				}
				if (strVigencia.equals("A")) {
					int iOperador = Integer.parseInt(strOperador.trim());

					switch (iOperador) {
					case 1:
						if (!TipoDato.equals("F")) {
							int iValor = Integer.parseInt(Valor.trim());
							int iOperando1 = Integer.parseInt(strOperando1
									.trim());
							if (iValor > iOperando1) {
								retorno[1] = "true";
							} else {
								retorno[1] = "false";
								if (strCampoA4.equals("")) {
									retorno[2] = "Mayor a " + strOperando1;
								} else {
									retorno[2] = "Mayor a " + strCampoA4;
								}

							}
						} else {
							int fecha1 = 0;
							int fecha2 = 0;
							String ArrFecha1[] = Valor.split("/");
							fecha1 = Integer.valueOf(ArrFecha1[0]).intValue()
									+ Integer.valueOf(ArrFecha1[1]).intValue()
									+ Integer.valueOf(ArrFecha1[2]).intValue();

							String ArrFecha2[] = strOperando1.split("-");
							fecha2 = Integer.valueOf(ArrFecha2[0]).intValue()
									+ Integer.valueOf(ArrFecha2[1]).intValue()
									+ Integer.valueOf(ArrFecha2[2]).intValue();

							if (fecha1 > fecha2) {
								retorno[1] = "true";
							} else {
								retorno[1] = "false";
								if (strCampoA4.equals("")) {
									retorno[2] = "Mayor a " + strOperando1;
								} else {
									retorno[2] = "Mayor a " + strCampoA4;
								}

							}
						}
						break;

					case 2:
						if (!TipoDato.equals("F")) {
							int iValor = Integer.parseInt(Valor.trim());
							int iOperando1 = Integer.parseInt(strOperando1
									.trim());
							if (iValor < iOperando1) {
								retorno[1] = "true";
							} else {
								retorno[1] = "false";
								if (strCampoA4.equals("")) {
									retorno[2] = "Menor a " + strOperando1;
								} else {
									retorno[2] = "Menor a " + strCampoA4;
								}

							}
						} else {
							int fecha1 = 0;
							int fecha2 = 0;
							String ArrFecha1[] = Valor.split("/");
							fecha1 = Integer.valueOf(ArrFecha1[0]).intValue()
									+ Integer.valueOf(ArrFecha1[1]).intValue()
									+ Integer.valueOf(ArrFecha1[2]).intValue();

							String ArrFecha2[] = strOperando1.split("-");
							fecha2 = Integer.valueOf(ArrFecha2[0]).intValue()
									+ Integer.valueOf(ArrFecha2[1]).intValue()
									+ Integer.valueOf(ArrFecha2[2]).intValue();

							if (fecha1 < fecha2) {
								retorno[1] = "true";
							} else {
								retorno[1] = "false";
								if (strCampoA4.equals("")) {
									retorno[2] = "Menor a " + strOperando1;
								} else {
									retorno[2] = "Menor a " + strCampoA4;
								}

							}
						}
						break;
					case 3:
						if (TipoDato.equals("N")) {
							int iValor = Integer.parseInt(Valor.trim());
							int iOperando1 = Integer.parseInt(strOperando1
									.trim());
							if (iValor == iOperando1) {
								retorno[1] = "true";
							} else {
								retorno[1] = "false";
								if (strCampoA4.equals("")) {
									retorno[2] = "Igual a " + strOperando1;
								} else {
									retorno[2] = "Igual a " + strCampoA4;
								}

							}
						} else if (TipoDato.equals("F")) {
							int fecha1 = 0;
							int fecha2 = 0;
							String ArrFecha1[] = Valor.split("/");
							fecha1 = Integer.valueOf(ArrFecha1[0]).intValue()
									+ Integer.valueOf(ArrFecha1[1]).intValue()
									+ Integer.valueOf(ArrFecha1[2]).intValue();

							String ArrFecha2[] = strOperando1.split("-");
							fecha2 = Integer.valueOf(ArrFecha2[0]).intValue()
									+ Integer.valueOf(ArrFecha2[1]).intValue()
									+ Integer.valueOf(ArrFecha2[2]).intValue();

							if (fecha1 == fecha2) {
								retorno[1] = "true";
							} else {
								retorno[1] = "false";
								if (strCampoA4.equals("")) {
									retorno[2] = "Igual a " + strOperando1;
								} else {
									retorno[2] = "Igual a " + strCampoA4;
								}

							}
						} else {
							if (Valor.equals(strOperando1)) {
								retorno[1] = "true";
							} else {
								retorno[1] = "false";
								if (strCampoA4.equals("")) {
									retorno[2] = "Igual a " + strOperando1;
								} else {
									retorno[2] = "Igual a " + strCampoA4;
								}

							}
						}
						break;

					case 4:
						if (!TipoDato.equals("F")) {
							int iValor = Integer.parseInt(Valor.trim());
							int iOperando1 = Integer.parseInt(strOperando1
									.trim());
							if (iValor >= iOperando1) {
								retorno[1] = "true";
							} else {
								retorno[1] = "false";
								if (strCampoA4.equals("")) {
									retorno[2] = "Mayor o Igual a "
											+ strOperando1;
								} else {
									retorno[2] = "Mayor o Igual a" + strCampoA4;
								}

							}
						} else {
							int fecha1 = 0;
							int fecha2 = 0;
							String ArrFecha1[] = Valor.split("/");
							fecha1 = Integer.valueOf(ArrFecha1[0]).intValue()
									+ Integer.valueOf(ArrFecha1[1]).intValue()
									+ Integer.valueOf(ArrFecha1[2]).intValue();

							String ArrFecha2[] = strOperando1.split("-");
							fecha2 = Integer.valueOf(ArrFecha2[0]).intValue()
									+ Integer.valueOf(ArrFecha2[1]).intValue()
									+ Integer.valueOf(ArrFecha2[2]).intValue();

							if (fecha1 >= fecha2) {
								retorno[1] = "true";
							} else {
								retorno[1] = "false";
								if (strCampoA4.equals("")) {
									retorno[2] = "Mayor o Igual a "
											+ strOperando1;
								} else {
									retorno[2] = "Mayor o Igual a" + strCampoA4;
								}

							}
						}
						break;
					case 5:
						if (!TipoDato.equals("F")) {
							int iValor = Integer.parseInt(Valor.trim());
							int iOperando1 = Integer.parseInt(strOperando1
									.trim());
							if (iValor <= iOperando1) {
								retorno[1] = "true";
							} else {
								retorno[1] = "false";
								if (strCampoA4.equals("")) {
									retorno[2] = "Menor o Igual a "
											+ strOperando1;
								} else {
									retorno[2] = "Menor o Igual a" + strCampoA4;
								}

							}
						} else {
							int fecha1 = 0;
							int fecha2 = 0;
							String ArrFecha1[] = Valor.split("/");
							fecha1 = Integer.valueOf(ArrFecha1[0]).intValue()
									+ Integer.valueOf(ArrFecha1[1]).intValue()
									+ Integer.valueOf(ArrFecha1[2]).intValue();

							String ArrFecha2[] = strOperando1.split("-");
							fecha2 = Integer.valueOf(ArrFecha2[0]).intValue()
									+ Integer.valueOf(ArrFecha2[1]).intValue()
									+ Integer.valueOf(ArrFecha2[2]).intValue();

							if (fecha1 <= fecha2) {
								retorno[1] = "true";
							} else {
								retorno[1] = "false";
								if (strCampoA4.equals("")) {
									retorno[2] = "Menor o Igual a "
											+ strOperando1;
								} else {
									retorno[2] = "Menor o Igual a" + strCampoA4;
								}

							}
						}
						break;

					case 6:
						if (TipoDato.equals("N")) {
							int iValor = Integer.parseInt(Valor.trim());
							int iOperando1 = Integer.parseInt(strOperando1
									.trim());
							if (iValor != iOperando1) {
								retorno[1] = "true";
							} else {
								retorno[1] = "false";
								if (strCampoA4.equals("")) {
									retorno[2] = "Diferente a " + strOperando1;
								} else {
									retorno[2] = "Diferente a" + strCampoA4;
								}

							}
						} else if (TipoDato.equals("F")) {
							int fecha1 = 0;
							int fecha2 = 0;
							String ArrFecha1[] = Valor.split("/");
							fecha1 = Integer.valueOf(ArrFecha1[0]).intValue()
									+ Integer.valueOf(ArrFecha1[1]).intValue()
									+ Integer.valueOf(ArrFecha1[2]).intValue();

							String ArrFecha2[] = strOperando1.split("-");
							fecha2 = Integer.valueOf(ArrFecha2[0]).intValue()
									+ Integer.valueOf(ArrFecha2[1]).intValue()
									+ Integer.valueOf(ArrFecha2[2]).intValue();

							if (fecha1 != fecha2) {
								retorno[1] = "true";
							} else {
								retorno[1] = "false";
								if (strCampoA4.equals("")) {
									retorno[2] = "Diferente a " + strOperando1;
								} else {
									retorno[2] = "Diferente a" + strCampoA4;
								}

							}
						} else {
							if (!Valor.equals(strOperando1)) {
								retorno[1] = "true";
							} else {
								retorno[1] = "false";
								if ((Object) strCampoA4 == null) {
									retorno[2] = "Diferente a " + strOperando1;
								} else {
									retorno[2] = "Diferente a" + strCampoA4;
								}

							}
						}
						break;

					case 7:
						if (TipoDato.equals("N")) {
							int iValor = Integer.parseInt(Valor.trim());
							int iOperando1 = Integer.parseInt(strOperando1
									.trim());
							int iOperando2 = Integer.parseInt(strOperando2
									.trim());
							if (iValor >= iOperando1 && iValor <= iOperando2) {
								retorno[1] = "true";
							} else {
								retorno[1] = "false";
								retorno[2] = "Entre " + strOperando1 + " y "
										+ strOperando2;
							}
						} else {
							if (TipoDato.equals("F")) {
								int fecha1 = 0;
								int fecha2 = 0;
								int fecha3 = 0;
								String ArrFecha1[] = Valor.split("/");
								fecha1 = Integer.valueOf(ArrFecha1[0])
										.intValue()
										+ Integer.valueOf(ArrFecha1[1])
												.intValue()
										+ Integer.valueOf(ArrFecha1[2])
												.intValue();

								String ArrFecha2[] = strOperando1.split("-");
								fecha2 = Integer.valueOf(ArrFecha2[0])
										.intValue()
										+ Integer.valueOf(ArrFecha2[1])
												.intValue()
										+ Integer.valueOf(ArrFecha2[2])
												.intValue();

								String ArrFecha3[] = strOperando2.split("-");
								fecha3 = Integer.valueOf(ArrFecha3[0])
										.intValue()
										+ Integer.valueOf(ArrFecha3[1])
												.intValue()
										+ Integer.valueOf(ArrFecha3[2])
												.intValue();

								if (fecha1 <= fecha2) {
									retorno[1] = "true";
								} else {
									retorno[1] = "false";
									retorno[2] = "Entre " + strOperando1
											+ " y " + strOperando2;
								}
							}
						}
						break;

					}
				} else {
					retorno[1] = "true";

				}
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return retorno;
	}

	public RestriccionVO findRestriccion(String CodRest) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		int iCodRest = Integer.parseInt(CodRest.trim());

		String query = "SELECT CODIGO,DESCRIPCION,OPERADOR,OPERANDO1,OPERANDO2,ALERTA,VIGENCIA "
				+ "FROM TCS_BEN_RESTRICCION WHERE CODIGO = ? ";

		RestriccionVO objRestriVO = new RestriccionVO();
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setInt(1, iCodRest);
			rst = pstmt.executeQuery();

			if (rst.next()) {
				objRestriVO.setCodigo(rst.getString("CODIGO"));
				objRestriVO.setDescripcion(rst.getString("DESCRIPCION"));
				objRestriVO.setOperador(rst.getString("OPERADOR"));
				objRestriVO.setOperando1(rst.getString("OPERANDO1"));
				objRestriVO.setOperando2(rst.getString("OPERANDO2"));
				objRestriVO.setAlerta(rst.getString("ALERTA"));
				objRestriVO.setVigencia(rst.getString("VIGENCIA"));
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return objRestriVO;
	}

	public int modificarRestriccion(String strCodRest, String[] Arr)
			throws DAOException {
		PreparedStatement pstmt = null;

		int iCodRestric = Integer.parseInt(strCodRest.trim());

		String query = "UPDATE TCS_BEN_RESTRICCION SET "
				+ " DESCRIPCION = UPPER(?), OPERADOR = ?, "
				+ " OPERANDO1 = upper(?), OPERANDO2 = UPPER(?), "
				+ " ALERTA = ?, VIGENCIA = ?, CAMPO_A4 = ? "
				+ " WHERE CODIGO = ? ";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setInt(1, iCodRestric);

			return pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
	}
}
